set -euxo pipefailでシェルスクリプトを安全にする
from set (Bash Builltin)
set -euxo pipefailでシェルスクリプトを安全にする
code:sh
set -euxo pipefail
-e ...error
... || trueとかやっておけば右辺のコマンド実行結果が非ゼロでもすぐに終了しなくなる
サブシェル以外の複合コマンドが(-eが無視されている間にコマンドが失敗したという理由で)非ゼロを返したとき、シェルは終了しない。ERR時のtrapはシェルが終了した際に実行される。
code:bash
set -e
trap "echo ERR trap fired!" ERR
myfunc() {
foo
}
( myfunc )
echo "bar"
# ERR trap fired!
# prog.sh: line 9: foo: command not found
# 注: echo "bar" は実行されない
code:bash
set -e
trap "echo ERR trap fired!" ERR
myfunc() {
foo
}
myfunc
echo "bar"
# prog.sh: line 4: foo: command not found
-E
If set, any trap on ERR is inherited by shell functions, command substitutions, and commands executed in a subshell environment. The ERR trap is normally not inherited in such cases.
-u
パラメータ展開を実行するときに、特殊パラメータ
「@」または「*」以外の未設定の変数およびパラメータ、ないし
「@」または「*」で添え字付けされた配列変数
をエラーとして扱う。
-x
単純なコマンド、forコマンド、caseコマンド、selectコマンド、算術forコマンドとその引数または関連する単語リストが展開されてから実行されるまでのトレースを出力をターミナル上にトレースしてくれる。
無くてもいいけどシェルスクリプトのデバッグに便利。
PS4環境変数で出力形式をカスタマイズ可能。
-o pipefail
コマンドが失敗した場合にパイプラインが失敗ステータスを返すようになる
Safer bash scripts with 'set -euxo pipefail' · vaneyckt.io